package com.canking.xiaomipj;
import android.annotation.TargetApi;
import android.app.Activity;
import android.app.AppOpsManager;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageInfo;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Binder;
import android.os.Build;
import android.os.Bundle;
import android.provider.Settings;
import android.support.v7.app.AppCompatActivity;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;
import com.canking.xiaomipj.XLogger.XLogger;
import java.lang.reflect.Method;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private Button mMiBtn, mAccessBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
XLogger.init(true);
setContentView(R.layout.activity_main);
mMiBtn = (Button) findViewById(R.id.button_mi);
mMiBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (isMiuiFloatWindowOpAllowed(MainActivity.this)) {
Toast.makeText(MainActivity.this, "以开启", Toast.LENGTH_SHORT).show();
} else {
openMiuiPermissionActivity(MainActivity.this);
}
}
});
mAccessBtn = (Button) findViewById(R.id.button_access);
mAccessBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent accessibleIntent = new Intent(Settings.ACTION_ACCESSIBILITY_SETTINGS);
MainActivity.this.startActivity(accessibleIntent);
}
});
}
/**
* 经测试V5版本是有区别的
*
* @param context
*/
public void openMiuiPermissionActivity(Context context) {
Intent intent = new Intent("miui.intent.action.APP_PERM_EDITOR");
if ("V5".equals(getProperty())) {
PackageInfo pInfo = null;
try {
pInfo = context.getPackageManager().getPackageInfo(context.getPackageName(), 0);
} catch (PackageManager.NameNotFoundException e) {
Log.e("canking", "error");
}
intent.setClassName("com.miui.securitycenter", "com.miui.securitycenter.permission.AppPermissionsEditor");
intent.putExtra("extra_package_uid", pInfo.applicationInfo.uid);
} else {
intent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
intent.putExtra("extra_pkgname", context.getPackageName());
}
if (isActivityAvailable(context, intent)) {
if (context instanceof Activity) {
Activity a = (Activity) context;
a.startActivityForResult(intent, 2);
}
} else {
Log.e("canking", "Intent is not available!");
}
}
public static boolean isActivityAvailable(Context cxt, Intent intent) {
PackageManager pm = cxt.getPackageManager();
if (pm == null) {
return false;
}
List<ResolveInfo> list = pm.queryIntentActivities(
intent, PackageManager.MATCH_DEFAULT_ONLY);
return list != null && list.size() > 0;
}
public static String getProperty() {
String property = "null";
if (!"Xiaomi".equals(Build.MANUFACTURER)) {
return property;
}
try {
Class<?> spClazz = Class.forName("android.os.SystemProperties");
Method method = spClazz.getDeclaredMethod("get", String.class, String.class);
property = (String) method.invoke(spClazz, "ro.miui.ui.version.name", null);
} catch (Exception e) {
e.printStackTrace();
}
return property;
}
/**
* 判断MIUI的悬浮窗权限
*
* @param context
* @return
*/
@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean isMiuiFloatWindowOpAllowed(Context context) {
final int version = Build.VERSION.SDK_INT;
if (version >= 19) {
return checkOp(context, 24); // AppOpsManager.OP_SYSTEM_ALERT_WINDOW
} else {
if ((context.getApplicationInfo().flags & 1 << 27) == 1 << 27) {
return true;
} else {
return false;
}
}
}
@TargetApi(Build.VERSION_CODES.KITKAT)
public static boolean checkOp(Context context, int op) {
final int version = Build.VERSION.SDK_INT;
if (version >= 19) {
AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
try {
Class<?> spClazz = Class.forName(manager.getClass().getName());
Method method = manager.getClass().getDeclaredMethod("checkOp", int.class, int.class, String.class);
int property = (Integer) method.invoke(manager, op,
Binder.getCallingUid(), context.getPackageName());
XLogger.e(AppOpsManager.MODE_ALLOWED + " invoke " + property);
if (AppOpsManager.MODE_ALLOWED == property) { //这儿反射就自己写吧
return true;
} else {
return false;
}
} catch (Exception e) {
XLogger.e(e.getMessage());
}
} else {
XLogger.e("Below API 19 cannot invoke!");
}
return false;
}
}